package com.intrbiz.bergamot.result.matcher; import java.util.HashMap; import java.util.Map; import java.util.function.Supplier; import com.intrbiz.bergamot.model.message.result.MatchOn; import com.intrbiz.bergamot.model.message.result.MatchOnAgentId; import com.intrbiz.bergamot.model.message.result.MatchOnCheckId; import com.intrbiz.bergamot.model.message.result.MatchOnHostAddress; import com.intrbiz.bergamot.model.message.result.MatchOnHostExternalRef; import com.intrbiz.bergamot.model.message.result.MatchOnHostName; import com.intrbiz.bergamot.model.message.result.MatchOnServiceExternalRef; import com.intrbiz.bergamot.model.message.result.MatchOnServiceName; import com.intrbiz.bergamot.model.message.result.MatchOnTrapExternalRef; import com.intrbiz.bergamot.model.message.result.MatchOnTrapName; public class Matchers { private Map<Class<? extends MatchOn>, Supplier<Matcher<?>>> matchers = new HashMap<Class<? extends MatchOn>, Supplier<Matcher<?>>>(); public Matchers() { // register default matchers this.registerMatcher(MatchOnAgentId.class, AgentIdMatcher::new); this.registerMatcher(MatchOnCheckId.class, CheckIdMatcher::new); this.registerMatcher(MatchOnHostName.class, HostNameMatcher::new); this.registerMatcher(MatchOnHostAddress.class, HostAddressMatcher::new); this.registerMatcher(MatchOnHostExternalRef.class, HostExternalRefMatcher::new); this.registerMatcher(MatchOnServiceName.class, ServiceNameMatcher::new); this.registerMatcher(MatchOnServiceExternalRef.class, ServiceExternalRefMatcher::new); this.registerMatcher(MatchOnTrapName.class, TrapNameMatcher::new); this.registerMatcher(MatchOnTrapExternalRef.class, TrapExternalRefMatcher::new); } public void registerMatcher(Class<? extends MatchOn> matchOn, Supplier<Matcher<?>> matcherFactory) { this.matchers.put(matchOn, matcherFactory); } @SuppressWarnings({ "rawtypes", "unchecked" }) public Matcher<?> buildMatcher(MatchOn match) { if (match == null) return null; // find a factory Supplier<Matcher<?>> matcherFactory = this.matchers.get(match.getClass()); if (matcherFactory == null) return null; // create the matcher Matcher<?> matcher = matcherFactory.get(); if (! ((Matcher) matcher).build(this, match)) return null; return matcher; } }